import { app, shell, BrowserWindow, ipcMain, screen, Tray, Menu, protocol, session } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import { setupIPC } from './ipc/'
import { registerAudioProtocol } from './protocols/audioProtocol'
import icon from '../../resources/icon.png?asset'

let mainWindow
let tray

function createWindow() {
  // 获取主显示器的尺寸信息
  const primaryDisplay = screen.getPrimaryDisplay()
  const { width, height } = primaryDisplay.workAreaSize // 不包括任务栏的工作区尺寸
  // 创建窗口
  mainWindow = new BrowserWindow({
    x: width * 0.15, // 工作区X坐标
    y: height * 0.15, //
    width: width * 0.7, // 工作区宽度
    height: height * 0.7, // 工作区高度
    // fullscreenable: false, // 禁用全屏功能（避免触发系统全屏）
    frame: false, // 无边框窗口
    // transparent: true, // 透明背景
    show: false, // 先隐藏窗口直到完全加载
    skipTaskbar: false, // 初始不隐藏任务栏图标
    // hasShadow: false, // 无阴影
    // resizable: false, // 禁止调整大小
    // alwaysOnTop: true, // 可选：保持在最前
    autoHideMenuBar: true,
    // paintWhenInitiallyHidden: false, // 当窗口隐藏时停止渲染
    ...(process.platform === 'linux' ? { icon } : {}),
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'),
      sandbox: false, //沙盒模式
      webSecurity: false, // 保持安全策略开启
      nodeIntegration: true, // 启用 Node.js
      contextIsolation: false, // 允许直接访问全局对象
      webviewTag: true // 启用 <webview> 标签
    }
  })

  mainWindow.on('ready-to-show', () => {
    // mainWindow.maximize() //初始打开最大化
    mainWindow.show()
    // setTimeout(() => {
    //   mainWindow.webContents.openDevTools()
    // }, 500)
  })

  // 窗口显示/隐藏事件处理
  mainWindow.on('show', () => {
    mainWindow.setSkipTaskbar(false) // 显示时显示任务栏图标
    updateTrayMenu(true)
  })

  mainWindow.on('hide', () => {
    mainWindow.setSkipTaskbar(true) // 隐藏时隐藏任务栏图标
    updateTrayMenu(false)
  })

  //设置自定义的窗口打开处理器
  mainWindow.webContents.setWindowOpenHandler((details) => {
    // 使用系统默认浏览器打开链接
    shell.openExternal(details.url)
    // 拒绝在 Electron 应用内创建新窗口
    return { action: 'deny' }
  })

  // 监听缩放相关事件
  ipcMain.handle('window:minimize', () => mainWindow.minimize())
  ipcMain.handle('window:maximize', () => {
    if (mainWindow.isMaximized()) {
      mainWindow.unmaximize()
      return false
    } else {
      mainWindow.maximize()
      return true
    }
  })
  ipcMain.handle('window:close', (e) => {
    if (!app.isQuitting) {
      e.preventDefault()
      mainWindow.hide()
    }
    return false
  })

  //基于electronic-vite-cli的渲染器HMR。
  //加载用于开发的远程URL或用于生产的本地html文件。
  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
  } else {
    mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
  }
}

// 创建系统托盘图标及菜单
function createTray() {
  // const iconPath = join(__dirname, 'icon.png') // 替换为你的图标路径
  tray = new Tray(icon)

  const contextMenu = Menu.buildFromTemplate([
    { label: '显示应用', click: () => mainWindow.show() },
    {
      label: '退出',
      click: () => {
        app.isQuitting = true
        app.quit()
      }
    }
  ])

  tray.setToolTip('应用名称')
  tray.setContextMenu(contextMenu)

  // 点击托盘图标显示窗口
  tray.on('click', () => {
    mainWindow.show()
  })
}

// 更新系统托盘菜单
function updateTrayMenu(isVisible) {
  const contextMenu = Menu.buildFromTemplate([
    {
      label: isVisible ? '隐藏应用' : '显示应用',
      click: () => (isVisible ? mainWindow.hide() : mainWindow.show())
    },
    { type: 'separator' }, //添加一条分隔线
    {
      label: '退出',
      click: () => {
        app.isQuitting = true
        app.quit()
      }
    }
  ])

  tray.setContextMenu(contextMenu)
}
protocol.registerSchemesAsPrivileged([
  {
    scheme: 'audio',
    privileges: {
      secure: true,
      standard: true,
      supportFetchAPI: true,
      stream: true
    }
  }
])

//当Electron完成时，将调用此方法
//初始化并准备创建浏览器窗口。
//某些API只能在此事件发生后使用。
app.whenReady().then(() => {
  // Set app user model id for windows
  electronApp.setAppUserModelId('com.electron')

  // 获取webview的session
  // const ses = session.fromPartition('persist:webview-session')

  // // 拦截并修改请求头
  // ses.webRequest.onBeforeSendHeaders((details, callback) => {
  //   details.requestHeaders['Authorization'] = 'Bearer 12eb209d6ac94a90b600b8cbfdb0c87c'
  //   details.requestHeaders['User-Agent'] =
  //     'curl -A "b3272100-d558-d020-8885-67e62441e1b3" https://app.yaoud.com'
  //   callback({ requestHeaders: details.requestHeaders })
  // })

  // 开发中默认按F12打开或关闭DevTools
  // 在生产中忽略CommandOrControl+R
  // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window)
  })

  if (process.platform === 'darwin') app.dock.hide() // 隐藏 macOS Dock 图标
  // app.userAgentFallback = 'curl -A "b3272100-d558-d020-8885-67e62441e1b3" https://app.yaoud.com'
  // 注册自定义音频协议
  registerAudioProtocol(protocol)
  createWindow()
  createTray()
  setupIPC(ipcMain)

  app.on('activate', function () {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// 关闭所有窗口后退出，macOS除外
// 让应用程序及其菜单栏保持活动状态，直到用户退出
// 显式使用Cmd+Q.
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 处理应用重新激活 (macOS)
app.on('before-quit', () => (app.isQuitting = true))

// 在此文件中，您可以包含应用程序的其他特定主进程
// code. You can also put them in separate files and require them here.
